package com.base.springboot.starter.mybatisplus.service;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * mybatis plus IService 二次封装类
 *
 * @author admin
 * @date 2020/5/19 AM10:15
 */
public interface GenericService<T> extends IService<T> {
    /**
     * 根据 ID 查询
     *
     * @param id 主键ID
     * @return 实体对象
     */
    public T getEntityById(Serializable id);

    /**
     * 查询列表
     *
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     * @return 实体对象列表
     */
    public List<T> listEntity(Wrapper<T> queryWrapper);

    /**
     * 查询（根据ID 批量查询）
     *
     * @param idList 主键ID列表
     * @return 实体对象列表
     */
    public List<T> listEntityByIds(Collection<? extends Serializable> idList);

    /**
     * 翻页查询
     *
     * @param page         翻页对象
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     * @return 实体对象分页对象
     */
    public <E extends IPage<T>> E pageEntity(E page, Wrapper<T> queryWrapper);

    /**
     * 翻页查询
     *
     * @param page         翻页对象
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     * @return 实体对象列表
     */
    public List<T> pageListEntity(Page<T> page, Wrapper<T> queryWrapper);

    /**
     * 插入一条记录（选择字段，策略插入）
     *
     * @param entity 实体对象
     * @return 插入结果，成功为true
     */
    public Boolean saveEntity(T entity);

    /**
     * 根据 ID 删除
     *
     * @param id 主键ID
     * @return 删除结果，成功为true
     */
    public Boolean removeEntityById(Serializable id);

    /**
     * 根据 ID 选择修改
     *
     * @param entity 实体对象
     * @return 更新结果，成功为true
     */
    public Boolean updateEntityById(T entity);

    /**
     * 获取实体属性对应数据库字段
     *
     * @param fieldName 数据库字段
     * @return 实体属性
     */
    public String getColumnName(String fieldName);

    /**
     * 分页计算起始值
     *
     * @param current 当前页
     * @param size    每页数量
     * @return 结果
     */
    public long offset(long current, long size);
}